/*
 * Classe que representa uma tabela
 * 
 */
package negocio;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Angelo
 */
public class Table {
    private String table_name;
    private List<Column> column_list;
    private int par_records;
    private double par_growth_rate;
    private int par_retention_time;
    private double init_liq;
    private double init_bruto;
    private double next_liq;
    private double next_bruto;

    /*
     * Construtor que permite instanciar a classe apenas com o nome da tabela
     */
    public Table(String table_name) {
        this.table_name = table_name;
        this.column_list = new ArrayList<Column>();
    }  
    
    /*
     * Construtor que instancia os a classe com dados mínimos para a simulação
     */
    public Table(String table_name, int par_records, double par_growth_rate, int par_retention_time) {
        this.table_name = table_name;
        this.column_list = new ArrayList<Column>();
        this.par_records = par_records;
        this.par_growth_rate = par_growth_rate;
        this.par_retention_time = par_retention_time;
    }

    public String getTable_name() {
        return table_name;
    }

    public void setTable_name(String table_name) {
        this.table_name = table_name;
    }

    public List<Column> getColumn_list() {
        return column_list;
    }
    
    /*
     * Método que retorna uma coluna da tabela
     */
    public Column getColumn(String column_name) {
        for(Column c: column_list){
            if(c.getColumn_name().equals(column_name)){
                return c;
            }
        }        
        return null;
    }

    public void setColumn_list(List<Column> column_list) {
        this.column_list = column_list;
    }

    public int getPar_records() {
        return par_records;
    }

    public void setPar_records(int par_records) {
        this.par_records = par_records;
    }

    public double getPar_growth_rate() {
        return par_growth_rate;
    }

    public void setPar_growth_rate(double par_growth_rate) {
        this.par_growth_rate = par_growth_rate;
    }

    public int getPar_retention_time() {
        return par_retention_time;
    }

    /*
     * Método que permite atualizar o percentual de retenção dos dados.
     * Garante que a retenção mínima seja de cinco anos
     */
    public void setPar_retention_time(int par_retention_time) throws Exception {
        if(par_retention_time<5){
            throw new Exception("O tempo de retenção mínimo é de 5(cinco) anos.");
        }        
        this.par_retention_time = par_retention_time;
    }
    
    public boolean addColumn(Column c){
        return this.column_list.add(c);
    }
    
    /*
     * Método que permite atualizar atributos da coluna de uma tabela
     * Garante que a coluna exista
     */
    public void  updateColumn(String column, Double avgSize, Double percNull) throws Exception{
        Column c = getColumn(column);
        if(c==null){
            throw new Exception("Coluna " + column + " não encontrada!");
        }
        c.setPar_avg_size(avgSize);
        c.setPar_percent_null(percNull);       
    }

    @Override
    public String toString() {
        return "Table{" + "table_name=" + table_name + ", column_list=" + column_list + ", par_records=" + par_records + ", par_growth_rate=" + par_growth_rate + ", par_retention_time=" + par_retention_time + '}';
    }                
}
